package com.koron.device.mapper;

import com.koron.device.bean.Equipment;
import com.koron.device.bean.EquipmentParams;
import com.koron.device.bean.EquipmentRobotDto;
import com.koron.device.bean.ExportParamMsgBean;
import com.koron.device.bean.census.EqMsgBo;
import com.koron.device.bean.po.EquipmentPo;
import com.koron.device.bean.query.AdvancedQuery;
import com.koron.device.bean.query.ERcodeQuery;
import com.koron.device.bean.query.EqParamQuery;
import com.koron.device.bean.template.EquipmentJsTemplate;
import com.koron.device.bean.twin.TwinEqBo;
import com.koron.device.bean.twin.TwinEqDto;
import com.koron.device.bean.vo.EquipmentCodeVO;
import org.apache.ibatis.annotations.Param;

import java.util.Collection;
import java.util.List;
import java.util.Map;

public interface EquipmentMapper {

    /**
     * 新增
     **/
    int insert(Equipment equipment);

    /**
     * 刪除
     **/
    int delete(@Param("id") String id);

    /**
     * 更新
     **/
    int update(Equipment equipment);

    int updateParentName(@Param("id") String id, @Param("name") String name);

    /**
     * 查关于关于父节点所有递归子级
     *
     * @param likeFullPathCode
     * @return
     */
    List<Equipment> queryByFullPathCodeLike(@Param("likeFullPathCode") String likeFullPathCode);

    // 右匹配全路径
    List<Equipment> queryByFullPathCodeRightLike(@Param("likeFullPathCode") String likeFullPathCode);

    /**
     * 跟新当前节点所有字节点及其孙子节点的full_path_name
     *
     * @param originName
     * @param currentName
     * @param parentId
     * @return
     */
    int updateFullPathName(@Param("originName") String originName, @Param("currentName") String currentName, @Param("parentId") String parentId);

    /**
     * 跟新当前节点所有字节点及其孙子节点的full_path_code
     *
     * @param originCode
     * @param currentCode
     * @param parentId
     * @return
     */
    int updateFullPathCode(@Param("originCode") String originCode, @Param("currentCode") String currentCode, @Param("parentId") String parentId);

    /**
     * 查询 根据唯一索引id查询
     **/
    Equipment getById(@Param("id") String id,@Param("LanguageType")String LanguageType);

    /**
     * 根据id列表批量查询详情
     *
     * @param ids 为空时返回空列表
     * @return
     */
    List<Equipment> getEquipsById(@Param("ids") List<String> ids);

    /**
     * 根据唯一索引code查询
     *
     * @param code
     * @return
     */
    Equipment getByCode(@Param("code") String code,@Param("LanguageType")String LanguageType);

    /**
     * 查询 分页查询
     **/
    List<Equipment> list(@Param("parentId") String parentId, @Param("name") String name,@Param("LanguageType")String LanguageType);

    // 机器人巡视台账树 懒加载
    List<EquipmentRobotDto> robotlist(@Param("parentId") String parentId);

    // 机器人巡视 - 查询单个设备
    EquipmentRobotDto robotGetEqById(@Param("id") String id);

    // 查询 前三层 的 设备 管理单位 台账节点
    List<Equipment> queryByThreeLevel(@Param("paramids") List<String> paramids, @Param("pump") String pump);

    // 查询 多个节点 code
    List<Equipment> batchqueryByFullPathCodeLike(@Param("fullPathCodes") List<String> fullPathCodes);

    // 查询 多个节点 code
    List<EquipmentRobotDto> queryByFullPathCodeLikeMore(@Param("nodeIds") List<String> nodeIds);

    // 查询 多个节点 code
    int queryChildrenCount(@Param("fullPathCode") String fullPathCode);

    // 查询 多个节点 code
    List<Equipment> queryChildrenByFullPathCode(@Param("fullPathCode") String fullPathCode);

    /**
     * 根据层级获取最大层级编码
     *
     * @param level
     * @return
     */
    Integer getMaxLevelCodeByLevel(@Param("level") Integer level);

    /**
     * 获取子目录中最大的sort
     *
     * @param parentId
     * @return
     */
    Integer getMaxSortByParentId(@Param("parentId") String parentId);

    /**
     * 获取孩子节点的个数
     *
     * @param parentId
     * @return
     */
    List<Equipment> getChildByParentId(@Param("parentId") String parentId);

    /**
     * 获取孩子节点in
     *
     * @param parentIds
     * @return
     */
    List<Equipment> getParentIdIn(@Param("parentIds") List<String> parentIds);

    /**
     * 根据id查询路径
     *
     * @param id
     * @return
     */
    String getPathById(@Param("id") String id);

    /**
     * 查询最大编码
     *
     * @param prefix
     * @return
     */
    String queryMaxCode(@Param("prefix") String prefix);

    /**
     * 导入查询最大编码
     *
     * @param prefix
     * @return
     */
    String impQueryMaxCode(@Param("prefix") String prefix);

    /**
     * 查询下一个层级
     *
     * @param id
     * @return
     */
    Integer getNextLevel(@Param("id") String id);

    String getNameById(@Param("id") String id);

    int countChild(@Param("id") String id);

    List<Map> countChildren(@Param("ids") List<String> ids);

    // 根据位置、工艺编码list 查专业数量
    List<Map> querySubProcessCodeChildrenQty(@Param("locCode") String locCode, @Param("subprocesscodelist") List<String> subprocesscodelist);

    // 根据位置、工艺、 专业编码list 查设备数量
    List<Map> querySubProcessCodeAndassetGroupCodeChildrenQty(@Param("locCode") String locCode, @Param("subprocesscode") String subprocesscode, @Param("assetgroupcodelist") List<String> assetgroupcodelist);

    /**
     * 批量新增参数
     *
     * @param list
     * @return
     */
    int batchInsertParams(List<EquipmentParams> list);

    /**
     * 参数查询，返回有值的参数
     *
     * @param equipIds 设备id列表
     * @param paramIds 参数id列表
     * @param paramIds 参数值列表
     * @return 返回 参数存于paramIds中的设备（paramIds中任何一个即可）
     */
    List<String> countParam(@Param("equipIds") List<String> equipIds, @Param("paramIds") List<String> paramIds, @Param("paramResult") List<String> paramResult);


    /**
     * 删除参数
     *
     * @param equipmentId
     * @return
     */
    int deleteParams(@Param("equipmentId") String equipmentId);

    /**
     * 根据设备id获取参数
     *
     * @param equipmentId
     * @return
     */
    List<Map<String, String>> getParams(@Param("equipmentId") String equipmentId);

    /**
     * 根据设备id查询设备的基础参数（预设参数）
     *
     * @param equipIds
     * @return
     */
    List<EquipmentParams> getEquipParamsByEquipIds(@Param("equipIds") List<String> equipIds);

    /**
     * 更新父id
     *
     * @param id
     * @param parentId
     * @return
     */
    int updateParentId(@Param("id") String id, @Param("parentId") String parentId, @Param("sort") Integer sort);

    /**
     * 更新子级父节点
     *
     * @param originalParentId
     * @param targetId
     * @return
     */
    int updateChildrenParentId(@Param("originalParentId") String originalParentId, @Param("targetId") String targetId);

    List<Equipment> getEquipmentByLocation(@Param("locationId") String locationId);

    /**
     * 获取结果在集合中的设备的所有参数
     *
     * @param paramResults
     * @return
     */
    List<EquipmentParams> getEquipParamsByResult(List<String> paramResults);

    /**
     * 获取结果在集合中的所有设备id
     *
     * @param paramResults
     * @return
     */
    List<String> getEquipIdsBymResult(List<String> paramResults);

    List<String> getFullPathName(List<Integer> list);

    List<String> getParentIds(List<Integer> list);

    /**
     * 根据参数id查询参数（技术参数和基础参数）
     *
     * @param paramId
     * @return
     */
    EquipmentParams getParamById(@Param("paramId") String paramId);

    List<EquipmentParams> getEquipmentParams(@Param("typeId") String typeId, @Param("equipmentId") String equipmentId);

    /**
     * 获取同组织下，最左上的设备台账
     * 如同组织下含有的设备台账编号如下：则获取1.1.1，level代表深度，sort代表高度 ===> 则取level最小，sort最小的台账，level优先级比sort高，故先对level排序
     * 1
     * 1.1.1
     * 1.2.1、1.2.2
     * 1.3.1、1.3.2、1.3.3
     * 2
     * 2.1.1
     * 2.2.1、2.2.2
     * 2.3.1、2.3.2、2.3.3
     *
     * @param deptId
     * @return
     */
    Equipment getLeftUpperEquipment(@Param("deptId") String deptId, @Param("equipIds") List<String> equipIds);

    /**
     * 设备是否存在某个参数，如果存在则返回设备id
     *
     * @param paramResults
     * @return
     */
    int existsParamByResult(@Param("paramResults") List<String> paramResults);

    Equipment getEquipmentByParamResult(@Param("paramResults") List<String> paramResults);

    /**
     * 查询equipmentId及其子节点设备
     *
     * @param equipmentId
     * @param deleteFlag  删除标志
     * @param level       值查询level >= #{level}的设备
     * @return
     */
    List<Equipment> getChildrenById(@Param("equipmentId") String equipmentId, @Param("deleteFlag") Boolean deleteFlag, @Param("level") Integer level);

    int deviceRectify(List<Equipment> equipments);

    int batchInsert(@Param("list") List<Equipment> list);

    List<Equipment> queryAll();

    List<Equipment> queryByFloorIn(@Param("floorCollection") Collection<String> floorCollection);

    List<Equipment> queryByIdIn(@Param("idCollection") Collection<String> idCollection);

    List<EquipmentParams> queryByEquipmentIdIn(@Param("equipmentIdCollection")Collection<String> equipmentIdCollection);

    int updateLevelPathAndLevelCodeSortBatchSelective(List<Equipment> list);

    int updateLevelPathBatchSelective(List<Equipment> list);

    List<TwinEqDto> queryByIdInAndCodeIn(TwinEqBo bo);

    // 更新设备表的预设参数
    int updateInAdvanceParamById(@Param("updatedInAdvanceParam") String updatedInAdvanceParam, @Param("id") String id);

    List<EquipmentParams> queryByParamIdIn(@Param("paramIdCollection") Collection<String> paramIdCollection);

    // 更新主表预设参数
    int updateInAdvanceJson(List<Equipment> list);

    // 获取管理单位设备信息完整数量
    List<EqMsgBo> querEqParamMsg(String deptId);

    // 获取管理单位设备图片信息完整数量
    List<EqMsgBo> querEqPictureMsg(String deptId);

    // 获取 110kV古旗线#1塔 下所有部件的参数
    List<EquipmentParams> queryEqParamsByEqId(@Param("eqIdCollection") Collection<String> eqIdCollection);

    // 查出高压线所有塔
    List<Equipment> queryAllTower();

    // 查询高压线补充部件
    List<Equipment> queryNewComponent();

    // 查询高压线补充部件的参数
    List<EquipmentParams> queryNewComponentParams();

    // 补充基础部件
    List<Equipment> queryBasicComponent();

    // 补充10kv线所有塔
    List<Equipment> queryTenKvTower();

    // 导出设备参数
    List<ExportParamMsgBean> queryParamEq(@Param("id") String id);

    // 导出设备技术参数
    List<ExportParamMsgBean> queryParamJsEq(@Param("id") String id);

    // 导出设备技术参数 (设备节点)
    List<EquipmentJsTemplate> queryParamJsEqMain(@Param("id") String id);

    // 检查 导出设备参数 数量
    int queryParamEqCount(@Param("id") String id);

    List<EquipmentPo> getByParamsList(AdvancedQuery query);

    List<Equipment> queryEqlist(@Param("query") EqParamQuery query);

    List<EquipmentCodeVO> getEquipmentByParentId(@Param("parentIds") List<String> parentIds);

    Equipment getByErCode(@Param("eRcodeQuery") ERcodeQuery eRcodeQuery);

    List<EquipmentPo> advancedEquipmentQuery(AdvancedQuery query);
    Integer getMaxEquipmentCodeByKKS(@Param("enCode")String enCode);

    Equipment getByEncode(@Param("encode") String encode,@Param("LanguageType")String LanguageType);

    // 检查amdCode 或 更根据 amdCode 查设备
    Equipment queryByAmdCodeAndId(@Param("amdCode")String amdCode,@Param("id")String id, @Param("locCode")String locCode);

    Equipment queryByLocCodeAndIsMain(@Param("locCode")String locCode, @Param("isMain")Integer isMain);

    // 根据位置编码查工艺
    List<String> queryByLocCode(@Param("locCode")String locCode);

    // 根据位置、工艺编码 找 专业
    List<String> queryByLocCodeAndSubProcessCode(@Param("locCode")String locCode, @Param("subProcessCode")String subProcessCode);

    // 根据位置、工艺、专业编码 找 设备
    List<Equipment> queryByLocCodeAndSubProcessCodeAndAssetGroupCode(@Param("locCode")String locCode, @Param("subProcessCode")String subProcessCode, @Param("assetGroupCode")String assetGroupCode);

    int updateBatchSelective(List<Equipment> list);

}
